﻿// 802 字典序最小拓扑序.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <memory.h>
#include <algorithm>
#include <queue>


using namespace std;
/*
http://oj.daimayuan.top/course/14/problem/760

给你一张 n个顶点 m条边的有向无环图，顶点编号从 1到 n
，请求出这张图的字典序最小的拓扑序列。

输入格式
第一行两个整数 n,m，表示图的顶点数和边数。

接下来 m行，每行两个整数 x,y，表示 x号点到 y号点有一条边。

输出格式
输出一行 n个数表示字典序最小的拓扑序列。

样例输入
4 3
1 2
2 3
4 2
样例输出
1 4 2 3
数据规模
对于所有数据，保证 2≤n≤10000,0≤m≤100000,1≤x,y≤n,x≠y。
*/

const int N = 10010, M = 100010;
int h[N], e[M], w[M], ne[M], idx;
int n, m;
int indeg[N];

void add(int a, int b) {
	e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}

vector<int> ans;
void solve() {
	priority_queue<int, vector<int>, greater<int> >q;
	for (int i = 1; i <= n; i++) {
		if (indeg[i] == 0) {
			q.push(i);
		}
	}


	while (q.size()) {
		int t = q.top(); q.pop();
		ans.push_back(t);

		for (int i = h[t]; i != -1; i = ne[i]) {
			int j = e[i];
			indeg[j]--;
			if (indeg[j] == 0) { q.push(j); }
		}
	}

	for (auto& e : ans) {
		cout << e << " ";
	}
}


int main()
{
	memset(h, -1, sizeof h);
	cin >> n >> m;
	for (int i = 0; i < m; i++) {
		int a, b; cin >> a >> b;
		add(a, b); indeg[b]++;
	}

	solve();

	return 0;
}
 